package core

import (
	"encoding/json"
	"io/ioutil"
	"net/http"
	"net/url"
)

// connect 服务连接
type connect struct {
	Path    string // 服务通信地址
	User    string // 用户名
	Pwd     string // 密码
	Fail    int    // 连接失败次数 -> 当三次连接失败将被销毁
	Name    string // 服务名称 - 通信后获取
	Version string // 服务版本号 - 通信后获取
	Desc    string // 服务描述 - 通信后获取
	Config  string // 服务配置文件 - 通信后获取
}

// connectResponseParam 服务连接通信后获取的数据
type connectResponseParam struct {
	Name    string `json:"name"`    // 服务名称
	Version string `json:"version"` // 服务版本号
	Desc    string `json:"desc"`    // 服务描述
	Config  string `json:"config"`  // 服务配置文件
}

// Communication 服务连接通信 如果失败数大于等于三次 则返回true
func (c *connect) Communication() bool {
	data := make(url.Values)
	data["user"] = []string{c.User}
	data["pwd"] = []string{c.Pwd}
	res, err := http.PostForm(c.Path+"/base", data)
	if err != nil {
		return c.addFail()
	}
	defer res.Body.Close()
	body, err := ioutil.ReadAll(res.Body)
	if err != nil {
		return c.addFail()
	}
	var resParam connectResponseParam
	err = json.Unmarshal(body, &resParam)
	if err != nil {
		c.addFail()
	}
	c.Name = resParam.Name
	c.Version = resParam.Version
	c.Desc = resParam.Desc
	c.Config = resParam.Config
	c.Fail = 0
	return false
}

// addFail 添加失败次数
func (c *connect) addFail() bool {
	c.Fail += 1
	return c.Fail >= 3
}
